package service.impl;

import constant.USERCONSTANT;
import dao.UserDao;
import entity.User;
import service.UserService;
import util.NetUtil;

import java.net.DatagramSocket;
import java.util.List;
import java.util.Objects;

/**
 * 用户服务类
 * 负责提供用户注册、登录、上线离线等服务
 *
 * @author Mr.Alpaca
 * @version 1.0.0
 */
public class UserServiceImpl implements UserService {
    /**
     * 单例
     */
    private static UserService service;
    /**
     * 数据库管理对象
     */
    private final UserDao dao;

    private UserServiceImpl() {
        dao = UserDao.getDao();
    }

    /**
     * 单例,DCL
     *
     * @return 本类单例对象
     */
    public static UserService getService() {
        if (service == null) {
            synchronized (UserServiceImpl.class) {
                if (service == null) {
                    service = new UserServiceImpl();
                }
            }
        }
        return service;
    }

    /**
     * 注册信息,不符合以下要求其中之一则注册失败
     * 1.该账号未注册过
     * 2.系统有空闲套接字
     *
     * @param id       用户id
     * @param password 用户密码
     * @param name     用户名
     * @return 注册结果
     */
    @Override
    public boolean register(long id, String password, String name) {
        // 若当前账号已存在则注册失败
        if (dao.selectUser(id) != null) {
            return false;
        }
        // 若系统已无空闲套接字则注册失败
        DatagramSocket socket = NetUtil.allocateUserSocket();
        if (socket == null) {
            return false;
        }
        return dao.insertUser(new User(id, password, name, socket));
    }

    /**
     * 用户登录,满足以下全部要求登录成功:
     * 1.用户注册过
     * 2.密码正确
     * 登录成功后会刷新系统当前操作的用户
     *
     * @param id       用户id
     * @param password 用户密码
     * @return 登录结果
     */
    @Override
    public boolean login(long id, String password) {
        // 若用户未注册过则登录失败
        User user = dao.selectUser(id);
        if (user == null) {
            return false;
        }
        // 验证密码是否正确
        boolean flag = Objects.equals(password, user.getPassword());
        if (!flag) {
            return false;
        }
        // 用户上线
        onlineUser(user);
        return true;
    }

    /**
     * 根据用户账号获取用户对象
     *
     * @param id 用户账号
     * @return 用户对象
     */
    @Override
    public User getUser(long id) {
        return dao.selectUser(id);
    }

    /**
     * 获取当前在线用户列表
     *
     * @return 用户列表
     */
    @Override
    public List<User> getOnlineUserList() {
        return dao.selectAllUser();
    }

    /**
     * 下线指定用户
     *
     * @param id 用户id
     */
    @Override
    public void offlineUser(long id) {
        dao.selectUser(id).setOnlineFlag(false);
    }

    /**
     * 上线指定用户
     *
     * @param id 用户id
     */
    @Override
    public void onlineUser(long id) {
        dao.selectUser(id).setOnlineFlag(true);
    }

    /**
     * 上线指定用户
     *
     * @param user 用户
     */
    @Override
    public void onlineUser(User user) {
        user.setOnlineFlag(true);
    }

    /**
     * 群发消息,即发送消息到聊天室全局留言板
     *
     * @param message 消息内容
     * @param user    用户
     */
    @Override
    public void multicast(String message, User user) {
        USERCONSTANT.MESSAGE_BOARD.append(user.getName())
                .append(": ")
                .append(message)
                .append("\n");
    }

    /**
     * 获取聊天室全局留言板所有消息
     *
     * @return 留言板消息
     */
    @Override
    public String getMessageBoard() {
        return USERCONSTANT.MESSAGE_BOARD.toString();
    }
}
